Skip to content

fix(tooling,#15974): la recette de l'organe emetteur enseigne la regle d'espacement - #15988

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/15974-md-table-recipe
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/15974-md-table-recipe

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/tooling — lane myia-po-2026:CoursIA — prev: DEEP/slides #15865

Contexte

scan_md_table_syntax.py détecte MATH_SPAN_PIPE (pipe brute dans un span $...$ d'une table) et recommande la forme de correction au worker. Or sa recommandation enseignait \lvert/\rvert sans la règle d'espacement — exactement la forme qui a produit les deux défauts du jour, attrapés à la main : \lverts (commande non définie par collage) sur #15958, et $\lvertS\lvert$ (collage + fermeture par un second ouvreur) sur #15965.

La garde posée en amont (payload roo-extensions#3621) ne couvrait pas cette prose-ci : un worker qui suit la sortie --check de cet organe recevait l'instruction incomplète.

A/B sur la sortie réellement imprimée au worker

Fixture notebook minimal, même pathologie ($|F_B| / |A|$), scanner avant puis après :

AVANT : [MATH_SPAN_PIPE] cell[0] L5: ... utiliser \lvert/\rvert
APRÈS : [MATH_SPAN_PIPE] cell[0] L5: ... utiliser \lvert/\rvert en separant la commande
                                 de son operande (espace ou {}) et en fermant par \rvert,
                                 pas par \lvert

Détection inchangée (même pathologie, même cellule, même ligne) : seule la recommandation gagne la règle qui lui manquait.

Correction apportée à l'issue (G.1)

L'issue proposait d'aligner la prose sur « la forme que le test du scanner utilise déjà » en recommandant \mid (condition) / \vert (valeur absolue). Vérification : le test n'utilise ni l'un ni l'autre. Son unique occurrence (test_scan_md_table_syntax.py:494) est $\lvert F_B\rvert / \lvert A\rvert$, soit \lvert/\rvert avec espacement. La recommandation de l'issue contredisait donc son propre critère d'alignement.

Le correctif est ancré sur la source, pas sur la proposition : on garde \lvert/\rvert (la forme réellement utilisée par le test et par les notebooks) et on ajoute les deux règles dont l'absence est la cause racine unique des deux défauts :

  1. ne jamais coller une commande LaTeX à la lettre suivante — \lvert doit être séparé de son opérande par une espace ou {} (le collage rend la commande indéfinie) ;
  2. fermer par \rvert, jamais par un second \lvert (deux ouvreurs s'apparient silencieusement au lieu de fermer).

Conformément à l'issue, la prose n'écrit pas les jetons cassés : une prose qui les montre est copiable telle quelle, c'est ainsi qu'ils se propagent.

Balayage frères (avant commit)

  • La prose de recommandation n'existe que dans ce fichier (+ son test) : git grep -ln 'MATH_SPAN_PIPE|pipe-free' → 2 hits, tous deux dans l'organe et son test. Rien à grouper, aucun frère à corriger.
  • Contrôle positif sur les notebooks qui contiennent lvert (2 ICT, SL-8) : ils utilisent la forme correcte et espacée (\lvert F_B\rvert / \lvert A\rvert). La pathologie n'est pas dans les notebooks — seule la prose de l'organe était fautive. (Le hit sur ICT-12c est un faux positif de grep sur un blob base64 inline.)

Périmètre — exactement celui annoncé par l'issue

1 fichier, 2 chaînes de prose (docstring l.32, detail l.523). Aucune modification de détection. Aucun test à changer. Diff : 2 hunks, prose seule.

Vérifications

  • test_scan_md_table_syntax.py — 85 passed
  • python -m py_compile — OK
  • A/B de sortie ci-dessus : détection identique, recommandation complétée
  • Preflight collision : aucune PR ouverte ne touche scripts/notebook_tools/scan_md_table_syntax.py

Résiduel — signalé, pas traité ici

La pathologie reste non détectée par la machine. L'organe recommande maintenant correctement, mais rien ne détecte le collage (\lvert suivi d'une lettre → commande indéfinie) ni l'appariement de deux ouvreurs — c'est précisément pourquoi #15958 et #15965 ont été attrapés à la main et non par une garde. C'est un volet détection, distinct de cette tranche prose ; il mérite son propre grain (élargir le scanner ou ajouter un organe, avec contrôles positif + négatif). Hors périmètre de l'issue, qui scope explicitement « ~2 lignes, aucun comportement modifié ».

Closes #15974

🤖 Generated with Claude Code

…e d'espacement

scan_md_table_syntax.py detecte MATH_SPAN_PIPE et recommande `\lvert`/`\rvert`
SANS la regle d'espacement -- exactement la forme qui a produit les deux defauts
attrapes a la main : `\lverts` (commande indefinie par collage, #15958) et
`$\lvertS\lvert$` (collage + fermeture par un second ouvreur, #15965).

A/B sur la sortie imprimee au worker (fixture notebook, meme pathologie) :
  AVANT : ... utiliser \lvert/\rvert
  APRES : ... utiliser \lvert/\rvert en separant la commande de son operande
          (espace ou {}) et en fermant par \rvert, pas par \lvert
Detection inchangee : meme pathologie, meme cellule, meme ligne.

Correction de la proposition de l'issue (G.1) : elle demandait d'aligner la
prose sur `\mid`/`\vert` comme "la forme que le test utilise deja" -- or le
test n'utilise ni l'un ni l'autre (test_scan_md_table_syntax.py:494 est
`$\lvert F_B\rvert / \lvert A\rvert$`, avec espacement). Le correctif garde donc
`\lvert`/`\rvert` et ajoute les deux regles manquantes : ne jamais coller une
commande LaTeX a la lettre suivante ; fermer par \rvert, jamais par \lvert.
Les jetons casses ne sont pas ecrits dans la prose (copiables tels quels).

Balayage freres : la prose de recommandation n'existe que dans ce fichier et son
test, rien a grouper. Les notebooks contenant `lvert` (2 ICT, SL-8) utilisent la
forme correcte et espacee -- la pathologie n'y est pas.

Perimetre : 1 fichier, 2 chaines de prose, aucune modification de detection.
85 tests passent, py_compile OK.

Closes #15974

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15988 (fix(tooling,#15974): la recette de l'organe emetteur enseigne la regle d'espacement) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Clôture comme superseded par #15975 (mergée le 2026-09-13T21:34:09Z, merge 9197b6da8582bd9556405383efd0bc15fb7fbcbf).

Vérification instant-T : les deux PR réécrivent les mêmes sites de scan_md_table_syntax.py, mais main enseigne désormais \mid/\vert avec espacement et porte le test causal test_detail_recipe_cannot_produce_broken_latex. La tête f51e33af est en conflit avec main; conserver sa recette \lvert/\rvert lors de la résolution ferait échouer ce test. Son résiduel propre (« fermer par \rvert ») devient sans objet avec la recette \mid/\vert déjà mergée.

Aucun contenu unique n'est donc perdu par cette clôture. L'issue #15974 reste ouverte : le volet distinct de détection du LaTeX collé n'est traité ni par cette PR ni par #15975.

@myia-ai-01 myia-ai-01 closed this Sep 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants